home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / ASM-A.ZIP / ANTIG.ASM < prev    next >
Assembly Source File  |  1995-10-29  |  7KB  |  427 lines

  1. .286
  2. .model small
  3. include push.mac
  4. .code
  5.  
  6. assume cs:_TEXT,ds:_TEXT
  7.  
  8.                 org     000h
  9. next_dev        dd     0FFFFFFFFh
  10. devatt          dw      8000h
  11.                 dw      offset strategy
  12.                 dw      offset interrupt
  13. nam             db      'antigame'
  14.  
  15. start proc far
  16.  
  17.  
  18. old_si  dw      0
  19. old_bx     dw    0
  20. old_cx    dw    0
  21. old_dx    dw    0
  22. es_main    dw    0
  23. num_ff    dw    0
  24. last_pag dw    0
  25. viroff    dw    0
  26. cnt    db    0
  27. count    db    0
  28. scan_seg dw     0
  29. mes db 'Found !','$'
  30. filnm   db      15 dup(0)
  31. buffer  db      'NCMAIN.EXE',0h,0h,0h,0h,0h
  32.     db    'QA.COM',
  33.         db      64 dup (0)
  34.  
  35. include datagame.inc
  36.  
  37.  
  38. int_21h_entry:
  39.  
  40.         pushf                    ; Push flags
  41.     sti                    ; Enable interrupts
  42.     cmp    ah,4Bh                ;
  43.         je      loc_25                          ; Jump if equal
  44.  
  45. loc_24:
  46.     popf                    ; Pop flags
  47.     db    0EAh
  48. old_21h_off  dw     ?
  49. old_21h_seg  dw  ?
  50.  
  51.  
  52. loc_25:
  53.     cmp    cs:cnt, 0
  54.     jne    loc_204
  55.     inc    cs:cnt
  56.     jmp    loc_24
  57. loc_204:
  58.     mov    cs:old_bx,bx
  59.     push    ax
  60.     push    cx
  61.     push    di
  62.     push    es
  63.         push    ds
  64.         push    si
  65.     push    dx
  66.  
  67.         mov     si,dx
  68. loc_205:
  69.     inc    si
  70.     cmp byte ptr ds:[si],0
  71.     jne    loc_205
  72.     mov    bh,0
  73. loc_206:
  74.     inc    bh
  75.     dec    si
  76.     cmp byte ptr ds:[si],'\'
  77.     jne    loc_206
  78.     inc    si
  79.     dec    bh
  80.     push    cs
  81.     pop    es
  82.     xor    cx,cx
  83.     mov    bl,-1
  84. loc_94:
  85.         inc     bl
  86.         lea     di,cs:buffer
  87.         mov     ax,15
  88.         mul     bl
  89.         add     di,ax
  90.         push    si
  91.         mov     cl,bh
  92.         rep     cmpsb
  93.         pop     si
  94.         je      loc_57
  95.         cmp     bl,4
  96.         jne     loc_94
  97.         jmp short loc_95
  98.  
  99. loc_57:
  100.         mov     byte ptr cs:count,0
  101.         jmp     loc_fin
  102.  
  103. loc_95:
  104.     mov    cl,bh
  105.         lea     di,cs:filnm
  106.         repne movsb
  107.         sub     si,3
  108.         cmp word ptr ds:[si],'XE'
  109.     jne    loc_47
  110.     lea    ax,cs:only_exe
  111.     mov  byte ptr bl,cs:only_exe_count
  112.         jmp short loc_files
  113.  
  114. loc_47:
  115.         cmp  word ptr ds:[si],'OC'
  116.     je     loc_79
  117.     lea    ax,cs:ov_pi
  118.     mov    byte ptr bl,cs:ov_pi_count
  119.         jmp short loc_files
  120.  
  121. loc_79:
  122.     lea    ax,cs:com_exe
  123.     mov  byte ptr bl,cs:com_exe_count
  124.  
  125. loc_files:
  126.  
  127.     mov    cs:viroff,ax
  128.         mov     byte ptr cs:count,bl
  129.  
  130.         mov     ah,3dh
  131.     xor    al,al
  132.     int     21h      ; file is open for reading
  133.     jc    loc_fin
  134.  
  135.         mov     bx,ax
  136.     mov    ah,42h
  137.     xor    cx,cx
  138.     mov    dx,cx
  139.     mov    al,2
  140.     int    21h    ; seek to the end
  141.  
  142.            mov    cs:num_ff,dx      ; save number of 64k
  143.     mov    cs:last_pag,ax    ; save length of last page
  144.  
  145.     mov    ah,3eh
  146.     int    21h     ; close the file
  147.  
  148. loc_fin:
  149.     pop    dx
  150.         pop     si
  151.         pop     ds
  152.     pop    es
  153.     pop    di
  154.     pop    cx
  155.     pop    ax
  156.     cmp    al,0
  157.     jne    lc_en
  158.     jmp short loc_en
  159. lc_en:
  160.     mov    bx,cs:old_bx
  161.     mov word ptr bx,es:[bx]
  162.     mov word ptr cs:scan_seg,bx
  163.     popf
  164.     pop    cs:old_ovl_off
  165.     pop    cs:old_ovl_seg
  166.     push    cs
  167.     push    offset cs:fal_ovl
  168.     pushf
  169.  
  170. loc_en:
  171.     mov    bx,cs:old_bx
  172.     jmp    loc_24
  173.  
  174. fal_ovl:
  175.     pushf
  176.     push    es
  177.         push    ds
  178.     push    ax
  179.  
  180.     mov    dx,cs:scan_seg
  181.     push    cs
  182.     pop    ds
  183.     call    scanvir
  184.     pop    ax
  185.     jnc    loc_nvi
  186.     call    message
  187.     mov    di,cs:old_ovl_seg
  188.     mov    es,di
  189.     mov    di,cs:old_ovl_off
  190.     mov    es:[di],21cdh
  191.     mov    ah,4ch
  192. loc_nvi:
  193.         pop     ds
  194.     pop    es
  195.     popf
  196.     db    0EAh
  197. old_ovl_off  dw  ?
  198. old_ovl_seg  dw  ?
  199.  
  200.  
  201. message:
  202.         mov     dx,si
  203.         mov     ah,09h
  204.         int    21h
  205.         lea     dx,mes
  206.         mov     ah,09h
  207.         int    21h
  208.     ret
  209.  
  210. int_4b_scan:
  211.  
  212.     pushf
  213.         mov     old_bx,bx
  214.     mov    old_dx,dx
  215. ;    push    cs
  216. ;    pop    ds
  217. ;    add     dx,10h            ; dx = Start seg
  218.  
  219. ;    call    scanvir
  220. ;    jc    loc_vir
  221.  
  222.         mov     ax,old_bx
  223.     mov    dx,old_dx
  224.         mov     ds,dx
  225.         mov     es,dx
  226.     popf
  227.     retf
  228.  
  229. loc_vir:
  230. ;    call    message
  231.         pop     dx
  232.     pop    dx
  233.         pop     ds
  234.     mov    dx,old_dx
  235.         push    dx
  236.         xor     dx,dx
  237.         push    dx
  238.         retf
  239.  
  240.  
  241. scanvir:
  242.     ; dx = segment for scan     (offset = 0)
  243.     ; cs:viroff = offset of virtable
  244.     ; ds = segment of virtable
  245.     ; cs:count = number of viruses
  246.     ; cs:num_ff = number of 64k
  247.     ; cs:last_pag = number of bytes in last page
  248.     ; return bit c if virus is founded
  249.     ; ds:si points to the viruses name
  250.     ; bp,es,di,bx,ax,dx ¼πß«α
  251.  
  252.         mov     cs:es_main,dx     ; es_main = Start_seg
  253.  
  254.     mov    bp,cs:viroff      ; bp - pointer to virus table
  255.     mov     bh,0
  256.  
  257. loc_5:
  258.     cmp     byte ptr cs:count,bh
  259.     jne    loc_61
  260.     ret
  261. loc_61:
  262.     inc    bh
  263.     mov    di,cs:es_main     ;
  264.     mov    es,di             ;
  265.     xor     di,di             ;
  266.     mov    dx,cs:num_ff      ;
  267.     mov    si,cs:[bp]        ; si points to this viruses pattern
  268.     lodsb
  269.     mov    bl,al             ; bl - counter of characters in virus pattern
  270.     sub    bl,1
  271.     lodsb                ; al - first char of pattern
  272.     jmp    loc_12            ; go to search
  273.  
  274. loc_9:
  275.     cmp    dx,-1             ; virus is ended ?
  276.     jne    loc_15            ; no
  277.     add    bp,2              ; bp points to the next virus
  278.         jmp    loc_5
  279.  
  280. loc_15:
  281.  
  282.     xor    di,di          ; di points to the beginning of the next segment
  283.     mov     cx,es             ;
  284.     add    cx,1000h          ;
  285.     mov    es,cx             ; es points to the next segment
  286.  
  287. loc_12:
  288.     cmp    dx,0              ; we'll work with last page ?
  289.     je    loc_2             ; yes
  290.     mov    cx,0ffffh         ; cx = maximum counter
  291.     jmp    loc_10
  292. loc_2:
  293.     mov     cx,cs:last_pag    ;
  294.  
  295. loc_10:
  296.  
  297.     repne    scasb             ; search for first char
  298.     je    loc_13            ; found
  299.     dec    dx                ; decrement of the counter of 64k
  300.     jmp    loc_9             ; go to the preparing for the search in next segment
  301.  
  302. loc_13:
  303.     mov    cs:old_cx,cx      ;
  304.     mov    cs:old_si,si
  305.     push    di
  306.     push    es
  307.     cmp    di,0fff0h
  308.     jbe    loc_7
  309.     mov    cx,es
  310.     inc    cx
  311.     mov    es,cx
  312.     sub    di,10h
  313.  
  314. loc_7:
  315.     xor    cx,cx
  316.     mov    cl,bl
  317.     repz    cmpsb
  318.     jne    loc_11
  319.     pop    es
  320.     pop    di
  321.     jmp    loc_89  ; found !
  322.  
  323. loc_11:
  324.     mov    si,cs:old_si
  325.     pop    es
  326.     pop    di
  327.     mov    cx,cs:old_cx
  328.     jmp    loc_10
  329.  
  330. loc_er:
  331.  
  332.  
  333. loc_89:
  334.     stc
  335.     ret
  336.  
  337. start endp
  338.  
  339. strategy proc far
  340.                 mov     cs:sav_off,bx
  341.                 mov     cs:sav_seg,es
  342.                 retf
  343.  
  344. sav_off         dw      0
  345. sav_seg         dw      0
  346. strategy endp
  347.  
  348. interrupt  proc far
  349.         nop
  350. install:
  351.             cli
  352.                mov    byte ptr cs:[interrupt],0CBh
  353.         pushf
  354.                 pushrs
  355.                 mov     bp,     sp
  356.  
  357.         xor     ax,ax
  358.         push    ax
  359.         pop     ds ; ds=0
  360.     cli
  361.  
  362.         les     di,ds:[21h*4]
  363.         mov     cs:old_21h_off,di
  364.         mov     cs:old_21h_seg,es
  365.  
  366.         les     di,ds:[31h*4]
  367.  
  368.         mov     ds:[21h*4],offset cs:int_21h_entry
  369.         mov     ds:[21h*4+2],cs
  370.  
  371.     sti
  372.  
  373.                                  ; find 'MZ'
  374.     mov    cx,-1
  375.     cld
  376.     mov    al,4dh
  377. loc_lo:
  378.     repne    scasb
  379.     jne    loc_err
  380.     cmp    byte ptr es:[di],5ah
  381.     jne    loc_lo
  382.  
  383. loc_loop:
  384.                                  ; 'MZ' found
  385.  
  386.     push    cs
  387.     pop    ds
  388.     lea     si,cs:pattern
  389.     inc    si
  390.  
  391.  
  392.     mov    byte ptr al,cs:[si-1]
  393.     inc    si
  394. loc_loop1:
  395.     dec    si
  396.     repne    scasb
  397.     jne    loc_err
  398.     push    cx
  399.     mov    cx,6
  400.     rep    cmpsb
  401.     pop    cx
  402.     jnz    loc_loop1
  403.  
  404. suc_end:
  405.     mov    byte ptr es:[di-5],0eah
  406.     mov    es:[di-4],offset cs:int_4b_scan
  407.     mov    es:[di-2],cs
  408. loc_err:
  409.                 les     di,dword ptr cs:sav_off
  410.                 mov     es:[di+0Eh],offset install
  411.                 mov     es:[di+10h],cs
  412.         mov word ptr es:[di+3],    0    ;
  413.         mov     sp,     bp
  414.         poprs
  415.     popf
  416.     retf
  417. pattern:
  418.     db    08eh
  419.     db    0c2h
  420.     db    08eh
  421.     db    0dah
  422.     db    08bh
  423.     db    0c3h
  424.     db    0cbh
  425.  
  426. interrupt endp
  427.     end